package com.example.demo.tool;

import java.security.MessageDigest;

import org.springframework.stereotype.Component;

/**
 * 计算哈希值
 * @author Meloa
 *
 */
@Component
public class SHACalculateHash {
    // CalculateHash方法：
    // 使用StringBuilder将name和password连接起来。
    // 调用getSHA256方法计算连接后字符串的SHA-256哈希值。
    public static String CalculateHash(String name, String password) {
        StringBuilder builder = new StringBuilder(name);
        builder.append(password);
        return getSHA256(builder.toString());
    }
    // getSHA256方法：
    //         通过MessageDigest.getInstance("SHA-256")获取SHA-256的MessageDigest实例。
    // 使用update方法将字符串转换为字节并更新到MessageDigest中。
    // 调用digest方法完成哈希计算，得到字节数组。
    // 调用byte2Hex方法将字节数组转换为十六进制字符串。
    public static String getSHA256(String str) {
        MessageDigest messageDigest;
        String encodeStr = "";

        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes("UTF-8"));
            encodeStr = byte2Hex(messageDigest.digest());
        }catch(Exception e) {
            System.out.println("error:"+e.getMessage());
        }
        return encodeStr;
    }
    // byte2Hex方法：
    // 遍历字节数组，将每个字节转换为十六进制字符串。
    // 如果转换后的十六进制字符串长度为1，则在前面添加一个0以确保每个字节都表示为两个字符。
    // 使用StringBuilder拼接所有的十六进制字符串，并返回最终结果。
    public static String byte2Hex(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        String temp;
        for(int i = 0; i < bytes.length; i++) {
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if(temp.length() == 1) {
                builder.append("0");
            }
            builder.append(temp);
        }
        return builder.toString();
    }

}

